You are here: Symbol Reference > Dew Namespace > Dew.Math Namespace > Dew.Math.Units Namespace > Classes > Optimization Class > Optimization Methods > Marquardt Method > Optimization.Marquardt Method (TRealFunction, TGradHess, double[], [In] double[], [In] object[], out double, TMtx, out TOptStopReason, [In] TMtxFloatPrecision, int, double, double, double, TStrings)
Dew Math for .NET
ContentsIndexHome
Example

Problem: Find the minimum of the "Banana" function by using the Marquardt method. 

Solution:The Banana function is defined by the following equation: 

 

Also, Marquardt method requires the gradient and Hessian matrix of the function. The gradient of the Banana function is: 

 

and the Hessian matrix is : 

 

 

// Objective function private double Banana(TVec x, TVec c, params object[] o) { return 100*Math387.IntPower(x[1] - Math387.IntPower(x[0],2),2) + Math387.IntPower(1-x[0],2); } // Analytical gradient and Hessian matrix of the objective function private void BananaGradHess(TRealFunction Fun, TVec Pars, TVec Consts, object[] obj, TVec Grad, TMtx Hess) { double[] Pars = Parameters.PValues1D(0); Grad[0] = -400.0*(Pars[1]-Math387.IntPower(Pars[0],2))*Pars[0] - 2*(1-Pars[0]); Grad[1] = 200.0*(Pars[1]-Math387.IntPower(Pars[0],2)); Hess.Values1D[0] = -400.0*Pars[1]+1200*Math387.IntPower(Pars[0],2)+2; Hess.Values1D[1] = -400.0*Pars[0]; Hess.Values1D[2] = -400.0*Pars[0]; Hess.Values1D[3] = 200.0; } private void Example() { double[2] Pars; double fmin; Matrix iHess = new Matrix(0,0); TOptStopReason StopReason; // initial estimates for x1 and x2 Pars[0] = 0; Pars[1] = 0; int iters = Optimization.Marquardt(Banana,BananaGradHess,Pars, null, null, out fmin, iHess, out StopReason, TMtxFloatPrecision.mvDouble, 1000, 1.0e-8, 1.0e-8, null); // stop if Iters >1000 or Tolerance < 1e-8 }
Copyright (c) 1999-2024 by Dew Research. All rights reserved.